﻿#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void bubble_sort(int *arr, int sz)
//该函数只能排序整型数据
{
	int flag = 1;//假设这⼀趟已经有序了
	for (int i = 0; i < sz; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				flag = 0;//发⽣交换就说明，⽆序
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		if (flag == 1)//这⼀趟没交换就说明已经有序，后续⽆序排序了
			break;
	}
}
void test()
{
	int arr[5] = { 1, 3, 2, 5, 4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
}



void Print(int* arr, int sz)
{
	for (int i = 0; i < sz; i++)
		printf("%d ", arr[i]);
}

int comp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;//返回值为正则e1 > e2,为零则e1 = e2,为负则e1 < e2
}

void test1()
{
	int arr[] = { 9, 3,6,1,2,4,5,7,8,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comp_int);
	Print(arr, sz);
}


//qsort 排序结构体数据
struct Stu
{
	char name[20];
	int age;
};

int comp_stru_by_name(const void* p1, const void* p2)
{
	return strcmp( ((struct Stu*)p1) -> name, ((struct Stu*)p2) -> name);
	//强制类型转换为结构体指针
	//strcmp需要头文件 <string.h>
	//strcmp是按照对应字符串中的字符的ASCII码值比较的
}

int comp_stru_by_age(const void* p1, const void* p2)
{
	return ( ((struct Stu*)p1) -> age) - ( ((struct Stu*)p2) ->age);
}

void test2()
{
	struct Stu arr2[3] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu",40} };
	int sz = sizeof(arr2) / sizeof(arr2[0]);
	qsort(arr2, sz, sizeof(arr2[0]), comp_stru_by_name);
	qsort(arr2, sz, sizeof(arr2[0]), comp_stru_by_age);
}




//模仿qsort改写冒泡排序


void Swap(char* buf1, char* buf2, size_t width)
{
	for (int i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
} 

void bubble_sort1(void* base, size_t sz, size_t width, int(*cmp)(const void* p1, const void* p2))
{
	int flag = 1;//假设这⼀趟已经有序了
	for (int i = 0; i < sz; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if ( cmp( (char *)base+j*width, (char*)base+(j+1)*width ) > 0)
			{
				flag = 0;//发⽣交换就说明，⽆序
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
		if (flag == 1)//这⼀趟没交换就说明已经有序，后续⽆序排序了
			break;
	}
}


void test3()
{
	int arr3[] = { 9, 2, 1, 5, 3, 4, 6, 8, 7, 0 };
	int sz = sizeof(arr3) / sizeof(arr3[0]);
	bubble_sort1(arr3, sz, sizeof(arr3[0]), comp_int);
	Print(arr3, sz);
}



int main()
{
	//test();
	//test1();
	//test2();
	test3();
	return 0;
}


//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//void print(struct Stu* ps)//接收地址
//{
//	printf("%s %d\n", (*ps).name, (*ps).age);
//	//解引用指针ps得到结构体s，再通过.访问
//	printf("%s %d\n", ps->name, ps->name);
//	//结构体成员访问操作符->,间接访问操作
//	//结构体指针->成员名
//}
//
//int main()
//{
//	struct Stu s = { "zhangsan", 18 };//创建结构体变量
//	printf("%s %d", s.name, s.age);
//	pirnt(&s);//传递s结构体地址
//	return 0;
//}

